using Serilog;
using Serilog.Events;

namespace Api.Config;

/// <summary>
/// 日志配置类
/// </summary>
/// <remarks>
/// 配置Serilog日志记录器，包括控制台输出和文件输出
/// </remarks>
public static class LoggerConfig
{
    /// <summary>
    /// 配置并创建Serilog日志记录器
    /// </summary>
    /// <returns>配置好的日志记录器</returns>
    public static Serilog.ILogger CreateLogger()
    {
        return new LoggerConfiguration()
            // 设置最小日志级别
            .MinimumLevel.Information()
            .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
            .MinimumLevel.Override("Microsoft.Hosting.Lifetime", LogEventLevel.Information)
            
            // 添加日志增强器
            .Enrich.FromLogContext()
            .Enrich.WithProperty("Application", "StudentManagement")
            
            // 控制台输出配置（带颜色）
            .WriteTo.Console(
                outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext} {Message:lj}{NewLine}{Exception}",
                theme: Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme.Code)
            
            // 文件输出配置（按天滚动）
            .WriteTo.File(
                path: "Logs/log-.txt",
                rollingInterval: RollingInterval.Day,
                outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} {Level:u3}] {SourceContext} {Message:lj}{NewLine}{Exception}",
                retainedFileCountLimit: 30)
            
            .CreateLogger();
    }
    
    /// <summary>
    /// 配置日志输出模板说明
    /// </summary>
    /// <remarks>
    /// 输出模板字段说明：
    /// - {Timestamp}: 时间戳
    /// - {Level}: 日志级别（INF, WRN, ERR等）
    /// - {SourceContext}: 日志来源类名
    /// - {Message}: 日志消息
    /// - {Exception}: 异常信息（如果有）
    /// </remarks>
    public const string ConsoleTemplate = "[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext} {Message:lj}{NewLine}{Exception}";
    
    /// <summary>
    /// 文件日志输出模板
    /// </summary>
    public const string FileTemplate = "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} {Level:u3}] {SourceContext} {Message:lj}{NewLine}{Exception}";
}
